home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
mg2a_src.zip
/
SYS
/
OSK
/
TTYIO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-08-23
|
3KB
|
143 lines
/*
* sys/osk/ttyio.c by Robert A. Larson
*
* The functions in this file
* negotiate with the operating system for
* keyboard characters, and write characters to
* the display in a barely buffered fashion.
*/
#include "def.h"
#include <sgstat.h>
#ifndef NO_DPROMPT
# include <varargs.h>
# define S_RDY 2437 /* arbitrary user signal */
#endif
#define NOBUF 512 /* Output buffer size. */
char obuf[NOBUF]; /* Output buffer. */
int nobuf;
struct sgbuf oldtty, newtty;
int nrow; /* Terminal size, rows. */
int ncol; /* Terminal size, columns. */
short ospeed; /* Terminal speed, for termlib.l */
#ifndef NO_DPROMPT
wakeup(signum)
int signum;
{
/* ignore the signal */
}
#endif
/*
* This function gets called once, to set up
* the terminal channel.
*/
ttopen()
{
if(_gs_opt(0, &oldtty) == -1) panic("can't get options");
ospeed = oldtty.sg_baud;
_strass(&newtty, &oldtty, sizeof(newtty)); /* newtty=oldtty; */
if(oldtty.sg_class == 0) { /* scf */
newtty.sg_backsp=
newtty.sg_delete=
newtty.sg_echo =
newtty.sg_alf =
newtty.sg_pause =
newtty.sg_bspch =
newtty.sg_dlnch =
newtty.sg_eorch =
newtty.sg_eofch =
newtty.sg_rlnch =
newtty.sg_dulnch=
newtty.sg_psch =
newtty.sg_kbich =
newtty.sg_kbach = 0;
#ifndef xon_xoff
newtty.sg_xon =
newtty.sg_xoff = 0;
#endif
if(_ss_opt(0, &newtty) == -1) panic("can't set options");
nrow = oldtty.sg_page == 0 ? NROW : oldtty.sg_page;
} else { /* not scf, fake it */
nrow = NROW;
}
ncol = NCOL;
#ifndef NO_DPROMPT
intercept(wakeup); /* ignore signals */
#endif
}
/*
* This function gets called just
* before we go back home to the shell. Put all of
* the terminal parameters back.
*/
ttclose()
{
ttflush();
if(_ss_opt(0, &oldtty) == -1) panic("can't reset options");
}
/*
* Write character to the display.
* Characters are buffered up, to make things
* a little bit more efficient.
*/
ttputc(c)
{
if (nobuf >= NOBUF)
ttflush();
obuf[nobuf++] = c;
}
/*
* Flush output.
*/
ttflush()
{
if (nobuf != 0) {
write(1, obuf, nobuf);
nobuf = 0;
}
}
/*
* Read character from terminal.
* All 8 bits are returned, so that you can use
* a multi-national terminal.
*/
ttgetc()
{
char buf[1];
while (read(0, &buf[0], 1) != 1)
;
return (buf[0] & 0xFF);
}
int typeahead()
{
return _gs_rdy(0) > 0;
}
panic(s) char *s; {
_ss_opt(0, &oldtty); /* ignore errors */
fputs("Panic: ", stdout); /* avoid printf, don't load all that */
puts(s);
exit(1);
}
#ifndef NO_DPROMPT
ttwait() {
if(_gs_rdy(0) > 0) return FALSE; /* already something waiting */
_ss_ssig(0, S_RDY); /* wake me when you have something */
if(sleep(2)!=0) return FALSE; /* sleep interupted */
_ss_rel(0);
return TRUE;
}
#endif